//给定一个字符串，编写一个函数判定其是否为某个回文串的排列之一。 
//
// 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。 
//
// 回文串不一定是字典当中的单词。 
//
// 
//
// 示例1： 
//
// 输入："tactcoa"
//输出：true（排列有"tacocat"、"atcocta"，等等）
// 
//
// 
//
// Related Topics 位运算 哈希表 字符串 👍 140 👎 0


package LeetCode.editor.cn;


import java.util.HashSet;
import java.util.Set;

/**
 * @author ldltd
 * @date 2025-06-03 19:40:36
 * @description 面试题 01.04.回文排列
 
 */
 
public class PalindromePermutationLcci {
    public static void main(String[] args) {
    //测试代码
    PalindromePermutationLcci fun = new PalindromePermutationLcci();
    Solution solution= fun.new Solution();
        System.out.println((int)'a'^'b'^'c');
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
        // 结果是 2a+b 或者 2a
    //
    public boolean canPermutePalindrome1(String s) {
        Set<Integer> set=new HashSet<>();
        for (char c : s.toCharArray()) {
            int code = c;
            if (set.contains(code)) {
                set.remove(code);
            } else {
                set.add(code);
            }
        }
        // 如果set的大小为0或者1，则说明可以构成回文
        return set.size() <= 1;
    }
    public  boolean canPermutePalindrome(String s) {
        long mask = 0;  // 64位掩码
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                mask ^= 1L << (c - 'A');          // 大写字母：0-25位
            } else if (c >= 'a' && c <= 'z') {
                mask ^= 1L << (c - 'a' + 26);    // 小写字母：26-51位
            }
            // 其他字符（如'/')忽略
        }
        return mask == 0 || (mask & (mask - 1)) == 0;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
